// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package runtime

import "unsafe"

var labelSync uintptr

// go:linkname runtime_setProfLabel runtime/pprof。runtime_setProfLabel 
func runtime_setProfLabel(labels unsafe.Pointer) {
	// 引入竞争优势，通过配置文件进行回读。
	// 这将更正确地使用&getg（）。标签为sync address，
	// 但是我们在信号处理程序中进行读取，然后不能调用race运行时。
	// 
	// 这使用了racereleasemerge，而不仅仅是racerelease，所以
	// 在profBuf中收购。read与之前的
	// setProfLabel操作同步，而不仅仅是最新的操作。这个
	// 很重要，因为。read将观察到不同的
	// 标签，这些标签是由不同的setProfLabel操作在
	// 不同的Goroutine上设置的，因此它需要与所有
	// 进行同步（如果我们可以同步
	// on&getg（），这不会是一个问题）。标签，因为我们将与每个
	// 最新标签分别写入。）
	// 
	// racereleasemerge就像是对
	// labelSync的完全读-修改-写，而不仅仅是一个商店版本，因此它对之前的racereleasemerge具有依赖性，而
	// 最终以profBuf的形式转入acquire。阅读
	if raceenabled {
		racereleasemerge(unsafe.Pointer(&labelSync))
	}
	getg().labels = labels
}

// go:linkname runtime_getProfLabel runtime/pprof。runtime\u getProfLabel 
func runtime_getProfLabel() unsafe.Pointer {
	return getg().labels
}
